﻿using HelloWorld.Config;
using HelloWorld.Entity;
using Microsoft.EntityFrameworkCore;

namespace HelloWorld.Repository.Impl
{
    // 仓储接口实现类
    public class CalculateRepository: ICalculateRepository
    {

        private readonly BloggingContext _context;

        public CalculateRepository(BloggingContext context)
        {
            _context = context;
        }

        public async Task<int> Sum(int i, int j)
        {
            // 单表查询
            var list = await _context.Blogs.ToListAsync();
            foreach (var item in list)
            {
                Console.WriteLine(item.Id);
                Console.WriteLine(item.Url);
            }

            // 连表查询
            int blogId = 1;

            var postsWithBlogUrl = await _context.Posts
                .Where(p => p.BlogId == blogId)
                .Select(p => new // 匿名类型初始化语法
                {
                    p.Title,
                    p.Content,
                    BlogUrl = p.Blog.Url
                })
                .ToListAsync();
            foreach (var post in postsWithBlogUrl)
            {
                Console.WriteLine(post.Title);
                Console.WriteLine(post.BlogUrl);
            }

            // 单条记录查询 不存在就返回Null
            var singleBlog = await this._context.Blogs
                .Where(b => b.Id == blogId)
                .FirstOrDefaultAsync();

            if (singleBlog == null)
            {
                Console.WriteLine("Not found");
            } else
            {
                Console.WriteLine(singleBlog.Url);
            }

            // 分页查询
            int pageSize = 10;
            int pageNumber = 1;

            var pagePosts = await this._context.Posts
                .OrderBy(p => p.Id)
                .Skip((pageNumber - 1) * pageSize)
                .Take(pageSize)
                .ToListAsync();
            foreach (var post in pagePosts)
            {
                Console.WriteLine(post.Title);
            }

            // 插入数据/修改数据/删除数据/批量新增/事务
            var transaction = this._context.Database.BeginTransaction(); // 事务
            
            try
            {
                var newBlog = new Blog { Url = "www.baidu.com" };
                this._context.Blogs.Add(newBlog);

                // 批量新增
                await this._context.AddRangeAsync(new Blog { Url = "a" }, new Blog { Url = "b" });

                await this._context.SaveChangesAsync();

                var blog = await this._context.Blogs.FirstOrDefaultAsync(b => b.Id == blogId);
                if (blog != null)
                {
                    blog.Url = "www.cnblog.com";
                    //this._context.Remove(blog); // 删除
                    await this._context.SaveChangesAsync();
                }
                transaction.Commit();
            }
            catch (Exception)
            {
                transaction.Rollback();
                throw;
            }

            // 可以通过FromSqlRaw来执行原生sql，再映射到DTO中

            // 外键约束 重写SQL生成器 略

            // SQL语句的查询 略

            // JWT Microsoft.AspNetCore.Authentication.JwtBearer 略

            // 统一响应格式 略

            // 全局异常处理 略

            // cors 略

            // 静态文件 略
            // https://localhost:7209/images/a.png 目录在wwwroot/

            // 日志 NLog 略
            // NLog.Web.AspNetCore
            // NLog

            // 参数校验 略

            // 注解 api(ef core) FluentApi 略
            //  1.设置表名 字段名 索引 联合索引 描述 取消外键索引
            // 名称用注解
            // 索引用FluentApi

            // 迁移: Add-Migration init
            // 执行迁移: Update-Database
            // 回滚: Update-Database -Migration previousname 指定版本回滚 0 表示回滚所有
            // 删除迁移: Remove-Migration

            return i + j;


        }
    }
}
